package cn.net.dckj.common.core.impl;

import cn.net.dckj.common.core.api.mapper.IBizDao;
import cn.net.dckj.common.core.api.service.IBizService;
import cn.net.dckj.common.core.domain.BaseEntity;
import cn.net.dckj.common.core.text.Convert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 对外服务的抽象接口实现, 封装了基本的对数据库的操作
 * Created by DIY_PC on 2019-5-28.
 */
public abstract class GenericBizServiceImpl<TD extends IBizDao<T, Long>, T extends BaseEntity> implements IBizService<T> {
    protected final Logger log = LoggerFactory.getLogger(this.getClass());

    protected String entityClassName;
    protected Class<T> baseClass;

    /**
     * 持久层对象
     */
    @Autowired
    protected TD dao;

    public GenericBizServiceImpl() {
        //Object obj = this.getClass().getGenericSuperclass();
        ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
        java.lang.reflect.Type type = genericSuperclass.getActualTypeArguments()[1];
        if (type instanceof Class) {
            this.baseClass = (Class<T>) type;
        } else if (type instanceof ParameterizedType) {
            this.baseClass = (Class<T>) ((ParameterizedType) type).getRawType();
        }
        this.entityClassName = this.baseClass.getName();
    }

    /**
     * 新增数据，带多附件上传
     *
     * @param entity
     * @param files
     * @return
     */
    @Override
    public T insert(T entity, List<MultipartFile> files) {
        return null;
    }

    /**
     * 逻辑删除数据信息
     *
     * @param entity 需要删除的实体
     * @return 结果
     */
    @Override
    public int logicDeleteById(T entity) {
        return this.dao.logicDeleteById(entity);
    }

    /**
     * 逻辑删除数据信息
     *
     * @param ids    需要删除的数据ID
     * @param entity
     * @return 结果
     */
    @Override
    public int logicDeleteByIds(String ids, T entity) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("entity", entity);
        map.put("ids", Convert.toStrArray(ids));
        return this.dao.logicDeleteByIds(map);
    }

    /**
     * Excel导入数据
     * 业务处理流程：先验证数据是否空等，然后验证数据唯一性。
     * 若验证数据不通过，则不允许导入；
     * 若验证数据唯一性，唯一条件一个可以更新，唯一条件多个则不可以更新，直接返回某某数据存在提示
     *
     * @param entityList      实体数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @return 结果
     */
    @Override
    public String importEntity(List<T> entityList, Boolean isUpdateSupport) {
        return null;
    }

    /**
     * 校验数据是否唯一
     *
     * @param entity 数据唯一条件
     * @return 结果
     */
    @Override
    public String checkUnique(T entity) {
        T result = this.dao.checkUnique(entity);
        if (result != null && result.getId() != null && result.getId() > 0) {
            return "1";
        }
        return "0";
    }

    /**
     * 查询多附件列表
     *
     * @param entity
     * @return
     */
    @Override
    public List<T> selectAttachmentList(T entity) {
        return this.dao.selectAttachmentList(entity);
    }
}
